package com.daxue.demomvc.init;

import com.daxue.demomvc.config.AppConfig;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;

/**
 * @author daxue0929
 * @date 2022/11/6
 * 实现spring提供的接口(WebApplicationInitializer)
 */


public class MyWebApplicationInitializer implements WebApplicationInitializer {
    /**
     * web 容器在启动的时候会调用onStartup()方法
     *
     * servlet 3.0之后 提出了一个新的规范SPI
     * 你的项目里面如果有某些类或者某些方法 需要在启动的时候 被Tomcat调用的话：
     * 首先 在你的项目的根目录的 META-INF/services下建立一个
     * javax.servlet.ServletContainerInitializer文件
     *
     * @param servletContext
     *  web容器上下文，保存了web容器的所有信息，
     *
     *  注册web组件的几种方法：
     *      web组件：filter servlet listener
     *
     *      1. 可以在web.xml文件中配置
     *      2. 也可以使用@WebServlet、@WebFilter、@WebListener
     *      3. 最后一种如下面的方法中，使用web上下文对象（ServletContext）
     *          servletContext.addServlet(..) 、servletContext.addListener(...) 等等。
     *
     *  tomcat是怎么调用了这个方法的：
     *      spring实现了Servlet提供的javax.servlet.ServletContainerInitializer接口。
     *          SpringServletContainerInitializer
     *      又定义了一个@HandlesTypes(WebApplicationInitializer.class)注解，把实现了WebApplicationInitializer接口的所有类都扫描出来。
     *      挨个调用onStartup方法
     */

    @Override
    public void onStartup(ServletContext servletContext) {
        // 用java注解的方式，去初始化spring 上下文环境
        AnnotationConfigWebApplicationContext annotationContext =
            new AnnotationConfigWebApplicationContext();
        // spring程序（容器）的上下文对象
        //      ClassPathXmlApplicationContext
        annotationContext.register(AppConfig.class);

        DispatcherServlet dispatcherServlet = new DispatcherServlet(annotationContext);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", dispatcherServlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("*.do");
    }
}
